home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / xalan.jar / org / apache / xalan / xpath / ExtensionFunctionHandler.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-04-12  |  8.7 KB  |  378 lines

  1. package org.apache.xalan.xpath;
  2.  
  3. import com.ibm.bsf.BSFEngine;
  4. import com.ibm.bsf.BSFException;
  5. import com.ibm.bsf.BSFManager;
  6. import com.ibm.cs.util.ReflectionUtils;
  7. import java.lang.reflect.Constructor;
  8. import java.lang.reflect.InvocationTargetException;
  9. import java.lang.reflect.Method;
  10. import java.util.Hashtable;
  11. import java.util.StringTokenizer;
  12. import java.util.Vector;
  13.  
  14. public class ExtensionFunctionHandler {
  15.    public String namespaceUri;
  16.    public String scriptLang;
  17.    public String scriptSrc;
  18.    public String scriptSrcURL;
  19.    public Object javaObject;
  20.    protected boolean hasCalledCTor;
  21.    public Class classObject;
  22.    protected Hashtable functions;
  23.    protected Hashtable elements;
  24.    protected BSFManager mgr;
  25.    protected boolean componentStarted;
  26.    Hashtable m_cachedMethods;
  27.    protected static boolean bsfInitialized;
  28.    // $FF: synthetic field
  29.    static Class class$java$lang$Double;
  30.    // $FF: synthetic field
  31.    static Class class$java$lang$Float;
  32.    // $FF: synthetic field
  33.    static Class class$java$lang$Boolean;
  34.    // $FF: synthetic field
  35.    static Class class$java$lang$Byte;
  36.    // $FF: synthetic field
  37.    static Class class$java$lang$Character;
  38.    // $FF: synthetic field
  39.    static Class class$java$lang$Short;
  40.    // $FF: synthetic field
  41.    static Class class$java$lang$Integer;
  42.    // $FF: synthetic field
  43.    static Class class$java$lang$Long;
  44.    // $FF: synthetic field
  45.    static Class class$com$ibm$bsf$BSFManager;
  46.  
  47.    public ExtensionFunctionHandler(String var1) {
  48.       this.scriptLang = "javaclass";
  49.       this.hasCalledCTor = false;
  50.       this.functions = new Hashtable();
  51.       this.elements = new Hashtable();
  52.       this.namespaceUri = var1;
  53.    }
  54.  
  55.    public ExtensionFunctionHandler(String var1, String var2, String var3, String var4, String var5) {
  56.       this(var1);
  57.       this.setFunctions(var2);
  58.       this.setScript(var3, var4, var5);
  59.    }
  60.  
  61.    public void setFunctions(String var1) {
  62.       if (var1 != null) {
  63.          StringTokenizer var2 = new StringTokenizer(var1, " \t\n\r", false);
  64.          Object var3 = new Object();
  65.  
  66.          while(var2.hasMoreTokens()) {
  67.             String var4 = var2.nextToken();
  68.             this.functions.put(var4, var3);
  69.          }
  70.  
  71.       }
  72.    }
  73.  
  74.    public void setElements(String var1) {
  75.       if (var1 != null) {
  76.          StringTokenizer var2 = new StringTokenizer(var1, " \t\n\r", false);
  77.          Object var3 = new Object();
  78.  
  79.          while(var2.hasMoreTokens()) {
  80.             String var4 = var2.nextToken();
  81.             this.elements.put(var4, var3);
  82.          }
  83.  
  84.       }
  85.    }
  86.  
  87.    public void setScript(String var1, String var2, String var3) {
  88.       this.scriptLang = var1;
  89.       this.scriptSrcURL = var2;
  90.       this.scriptSrc = var3;
  91.    }
  92.  
  93.    public boolean isFunctionAvailable(String var1) {
  94.       return this.functions.get(var1) != null;
  95.    }
  96.  
  97.    public boolean isElementAvailable(String var1) {
  98.       return this.elements.get(var1) != null;
  99.    }
  100.  
  101.    public Object callJava(Object var1, String var2, Object[] var3, Object var4) throws BSFException {
  102.       int var5 = var2.lastIndexOf(".");
  103.       Object var6 = null;
  104.       boolean var7 = false;
  105.       if (var5 == -1) {
  106.          var1 = var3[0];
  107.          if (var3.length > 1) {
  108.             var6 = new Object[var3.length - 1];
  109.             System.arraycopy(var3, 1, var6, 0, var3.length - 1);
  110.          } else {
  111.             var6 = null;
  112.          }
  113.       } else {
  114.          String var8 = var2.substring(0, var5);
  115.          var2 = var2.substring(var5 + 1);
  116.          var6 = var3;
  117.          var7 = var2.equals("new");
  118.  
  119.          try {
  120.             if (var1 == null) {
  121.                var1 = Class.forName(var8);
  122.             }
  123.          } catch (ClassNotFoundException var14) {
  124.             throw new BSFException(1, "unable to load class '" + var8 + "'", var14);
  125.          }
  126.       }
  127.  
  128.       if (this.m_cachedMethods != null && !var7 && var1 != null) {
  129.          try {
  130.             Method var18 = (Method)this.m_cachedMethods.get(var4);
  131.             if (var18 != null) {
  132.                return var18.invoke(var1, (Object[])var6);
  133.             }
  134.          } catch (Exception var13) {
  135.          }
  136.       }
  137.  
  138.       Class[] var19 = null;
  139.       if (var6 != null) {
  140.          var19 = new Class[((Object[])var6).length];
  141.  
  142.          for(int var9 = 0; var9 < var19.length; ++var9) {
  143.             var19[var9] = ((Object[])var6)[var9] != null ? ((Object[])var6)[var9].getClass() : null;
  144.          }
  145.       }
  146.  
  147.       boolean var20 = false;
  148.       boolean var10 = false;
  149.  
  150.       try {
  151.          while(!var20) {
  152.             if (var6 == null) {
  153.                var20 = true;
  154.             } else if (!var10) {
  155.                for(int var21 = 0; var21 < var19.length; ++var21) {
  156.                   Class var25 = var19[var21];
  157.                   if (var25 != null) {
  158.                      if (var25 == (class$java$lang$Double != null ? class$java$lang$Double : (class$java$lang$Double = class$("java.lang.Double")))) {
  159.                         var25 = Double.TYPE;
  160.                      }
  161.  
  162.                      if (var25 == (class$java$lang$Float != null ? class$java$lang$Float : (class$java$lang$Float = class$("java.lang.Float")))) {
  163.                         var25 = Float.TYPE;
  164.                      } else if (var25 == (class$java$lang$Boolean != null ? class$java$lang$Boolean : (class$java$lang$Boolean = class$("java.lang.Boolean")))) {
  165.                         var25 = Boolean.TYPE;
  166.                      } else if (var25 == (class$java$lang$Byte != null ? class$java$lang$Byte : (class$java$lang$Byte = class$("java.lang.Byte")))) {
  167.                         var25 = Byte.TYPE;
  168.                      } else if (var25 == (class$java$lang$Character != null ? class$java$lang$Character : (class$java$lang$Character = class$("java.lang.Character")))) {
  169.                         var25 = Character.TYPE;
  170.                      } else if (var25 == (class$java$lang$Short != null ? class$java$lang$Short : (class$java$lang$Short = class$("java.lang.Short")))) {
  171.                         var25 = Short.TYPE;
  172.                      } else if (var25 == (class$java$lang$Integer != null ? class$java$lang$Integer : (class$java$lang$Integer = class$("java.lang.Integer")))) {
  173.                         var25 = Integer.TYPE;
  174.                      } else if (var25 == (class$java$lang$Long != null ? class$java$lang$Long : (class$java$lang$Long = class$("java.lang.Long")))) {
  175.                         var25 = Long.TYPE;
  176.                      }
  177.  
  178.                      var19[var21] = var25;
  179.                   }
  180.                }
  181.  
  182.                var10 = true;
  183.             } else {
  184.                for(int var11 = 0; var11 < var19.length; ++var11) {
  185.                   Class var24 = var19[var11];
  186.                   if (var24 != null) {
  187.                      if (var24 == Double.TYPE) {
  188.                         var24 = class$java$lang$Double != null ? class$java$lang$Double : (class$java$lang$Double = class$("java.lang.Double"));
  189.                      }
  190.  
  191.                      if (var24 == Float.TYPE) {
  192.                         var24 = class$java$lang$Float != null ? class$java$lang$Float : (class$java$lang$Float = class$("java.lang.Float"));
  193.                      } else if (var24 == Boolean.TYPE) {
  194.                         var24 = class$java$lang$Boolean != null ? class$java$lang$Boolean : (class$java$lang$Boolean = class$("java.lang.Boolean"));
  195.                      } else if (var24 == Byte.TYPE) {
  196.                         var24 = class$java$lang$Byte != null ? class$java$lang$Byte : (class$java$lang$Byte = class$("java.lang.Byte"));
  197.                      } else if (var24 == Character.TYPE) {
  198.                         var24 = class$java$lang$Character != null ? class$java$lang$Character : (class$java$lang$Character = class$("java.lang.Character"));
  199.                      } else if (var24 == Short.TYPE) {
  200.                         var24 = class$java$lang$Short != null ? class$java$lang$Short : (class$java$lang$Short = class$("java.lang.Short"));
  201.                      } else if (var24 == Integer.TYPE) {
  202.                         var24 = class$java$lang$Integer != null ? class$java$lang$Integer : (class$java$lang$Integer = class$("java.lang.Integer"));
  203.                      } else if (var24 == Long.TYPE) {
  204.                         var24 = class$java$lang$Long != null ? class$java$lang$Long : (class$java$lang$Long = class$("java.lang.Long"));
  205.                      }
  206.  
  207.                      var19[var11] = var24;
  208.                   }
  209.                }
  210.  
  211.                var20 = true;
  212.             }
  213.  
  214.             try {
  215.                if (var7) {
  216.                   Constructor var23 = ReflectionUtils.getConstructor((Class)var1, var19);
  217.                   Object var27 = var23.newInstance((Object[])var6);
  218.                   return var27;
  219.                }
  220.  
  221.                Method var22 = ReflectionUtils.getMethod(var1, var2, var19);
  222.                Object var26 = var22.invoke(var1, (Object[])var6);
  223.                if (!var7) {
  224.                   if (this.m_cachedMethods == null) {
  225.                      this.m_cachedMethods = new Hashtable();
  226.                   }
  227.  
  228.                   this.m_cachedMethods.put(var4, var22);
  229.                }
  230.  
  231.                return var26;
  232.             } catch (NoSuchMethodException var15) {
  233.                if (var20) {
  234.                   throw var15;
  235.                }
  236.             }
  237.          }
  238.  
  239.          return null;
  240.       } catch (Exception var16) {
  241.          Throwable var12 = var16 instanceof InvocationTargetException ? ((InvocationTargetException)var16).getTargetException() : null;
  242.          throw new BSFException(BSFException.REASON_OTHER_ERROR, "method call/new failed: " + var16 + (var12 == null ? "" : " target exception: " + var12), var12);
  243.       }
  244.    }
  245.  
  246.    public Object callFunction(String var1, Vector var2, Object var3, Class var4) throws XPathException {
  247.       if (!this.componentStarted) {
  248.          this.startupComponent(var4);
  249.       }
  250.  
  251.       boolean var5 = false;
  252.  
  253.       try {
  254.          if (this.mgr == null) {
  255.             this.mgr = new BSFManager();
  256.          }
  257.  
  258.          boolean var9 = false;
  259.          BSFEngine var6;
  260.          byte var8;
  261.          Object[] var13;
  262.          if (this.scriptLang.equals("javaclass")) {
  263.             var5 = true;
  264.             var9 = var1.equals("new");
  265.             var6 = this.mgr.loadScriptingEngine("xslt-javaclass");
  266.             if (var9) {
  267.                var13 = new Object[var2.size()];
  268.                var8 = 0;
  269.                var1 = this.classObject.getName() + ".new";
  270.                this.javaObject = null;
  271.                this.hasCalledCTor = true;
  272.             } else if (!this.hasCalledCTor) {
  273.                if (this.javaObject == null) {
  274.                   this.javaObject = this.classObject.newInstance();
  275.                }
  276.  
  277.                var13 = new Object[var2.size() + 1];
  278.                var13[0] = this.javaObject;
  279.                var8 = 1;
  280.             } else {
  281.                var13 = new Object[var2.size()];
  282.                var8 = 0;
  283.             }
  284.          } else {
  285.             var6 = this.mgr.loadScriptingEngine(this.scriptLang);
  286.             var13 = new Object[var2.size()];
  287.             var8 = 0;
  288.          }
  289.  
  290.          for(int var10 = 0; var10 < var2.size(); ++var10) {
  291.             Object var11 = var2.elementAt(var10);
  292.             var13[var10 + var8] = var11 instanceof XObject ? ((XObject)var11).object() : var11;
  293.          }
  294.  
  295.          if (var5) {
  296.             return this.callJava(this.javaObject, var1, var13, var3);
  297.          } else {
  298.             return var6.call((Object)null, var1, var13);
  299.          }
  300.       } catch (Exception var12) {
  301.          String var7 = ((Throwable)var12).getMessage();
  302.          if (var7 != null) {
  303.             if (var7.startsWith("Stopping after fatal error:")) {
  304.                var7 = var7.substring("Stopping after fatal error:".length());
  305.             }
  306.  
  307.             System.out.println("Call to extension function failed: " + var7);
  308.             return new XNull();
  309.          } else {
  310.             throw new XPathProcessorException("Extension not found");
  311.          }
  312.       }
  313.    }
  314.  
  315.    protected void startupComponent(Class var1) throws XPathProcessorException {
  316.       if (!bsfInitialized) {
  317.          Class var2 = class$com$ibm$bsf$BSFManager != null ? class$com$ibm$bsf$BSFManager : (class$com$ibm$bsf$BSFManager = class$("com.ibm.bsf.BSFManager"));
  318.          synchronized(var2){}
  319.  
  320.          try {
  321.             bsfInitialized = true;
  322.             BSFManager.registerScriptingEngine("xslt-javaclass", "org.apache.xalan.xpath.XSLTJavaClassEngine", new String[0]);
  323.          } catch (Throwable var9) {
  324.             throw var9;
  325.          }
  326.       }
  327.  
  328.       if (var1 != null) {
  329.          this.classObject = var1;
  330.          if (this.scriptSrcURL.startsWith("class:")) {
  331.             this.javaObject = var1;
  332.          }
  333.  
  334.       } else if (this.scriptLang.equals("javaclass") && this.scriptSrcURL != null) {
  335.          try {
  336.             String var10 = this.scriptSrcURL;
  337.             boolean var3 = false;
  338.             if (this.scriptSrcURL.startsWith("class:")) {
  339.                var10 = this.scriptSrcURL.substring(6);
  340.                var3 = true;
  341.             }
  342.  
  343.             this.classObject = Class.forName(var10);
  344.             if (var3) {
  345.                this.javaObject = this.classObject;
  346.             }
  347.  
  348.             this.componentStarted = true;
  349.          } catch (Exception var7) {
  350.             throw new XPathProcessorException(((Throwable)var7).getMessage(), var7);
  351.          }
  352.       } else if (this.scriptSrcURL != null) {
  353.          throw new XPathProcessorException("src attr not supported (yet)");
  354.       } else if (this.scriptSrc != null) {
  355.          if (this.mgr == null) {
  356.             this.mgr = new BSFManager();
  357.          }
  358.  
  359.          try {
  360.             this.mgr.exec(this.scriptLang, "LotusXSLScript", -1, -1, this.scriptSrc);
  361.          } catch (BSFException var8) {
  362.             throw new XPathProcessorException(((Throwable)var8).getMessage(), var8);
  363.          }
  364.  
  365.          this.componentStarted = true;
  366.       }
  367.    }
  368.  
  369.    // $FF: synthetic method
  370.    static Class class$(String var0) {
  371.       try {
  372.          return Class.forName(var0);
  373.       } catch (ClassNotFoundException var2) {
  374.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  375.       }
  376.    }
  377. }
  378.